package utiles.zip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class CrearZip {
	private ZipOutputStream archivoZip;
	private File zip;
	private List<String> listaNombres= new ArrayList<String>();

	public CrearZip(String carpeta, String nombreArchivo, String nombreZip) throws IOException {
		File archivo= new File(carpeta+"/"+nombreArchivo);
		
		if(archivo.exists()){
			zip= new File(archivo.getParent()+"/"+nombreZip);
			archivoZip = new ZipOutputStream(new FileOutputStream(zip));
			System.out.println("Archivo Zip creado: "+zip.getAbsolutePath());

			agregarEntradas(carpeta, archivo);

			archivoZip.close();
		}
	}

	private void agregarEntradas(String carpetaRaiz, File archivo) throws IOException {

		procesarCarpetas("", archivo.getAbsolutePath());

		System.out.println("Directorio leido:");
		for(String nombre: listaNombres){
			System.out.println(nombre);
		}

		agregarArchivosAZip(carpetaRaiz);		
	}

	private void agregarArchivosAZip(String carpetaRaiz) throws IOException {
		FileInputStream fis;
		File f;
		for(String ac: listaNombres){
			f= new File(carpetaRaiz+"/"+ac);
			System.out.println("Entrada a cargar: "+f.getAbsolutePath());

			fis = new FileInputStream(f);

			ZipEntry entrada = new ZipEntry(ac);
			archivoZip.putNextEntry(entrada);

			byte [] buffer = new byte[1024];
			int leido=0;
			while (0 < (leido=fis.read(buffer))){
				archivoZip.write(buffer,0,leido);
			}
			archivoZip.closeEntry();
			fis.close();
		}		
	}

	private void procesarCarpetas(String carpetaRaiz, String pathCarpeta){
		File carpeta= new File(pathCarpeta);
		String rutaRelativa= carpetaRaiz+carpeta.getName();


		if(carpeta.isDirectory()){
			for(File sub: carpeta.listFiles()){
				procesarCarpetas(rutaRelativa+"/", sub.getAbsolutePath());
			}
		}else{
			listaNombres.add(rutaRelativa);
		}
	}

	public ZipOutputStream getArchivoZip() {
		return archivoZip;
	}

	@Override
	public String toString() {
		String z= zip==null?"NO SE PUDO CREAR ARCHIVO ZIP.":zip.getAbsolutePath();
		return z;
	}

	public static void main(String[] args) {
		String carpeta= "D:/testZip", nombreArchivoOrigen= "test",
				nombreZip= "pepito.zip";
		try {
			CrearZip zip= new CrearZip(carpeta, nombreArchivoOrigen, nombreZip);
			System.out.println(zip);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
